package com.cmc.cloud.cmclink.doc.service;

import com.cmc.cloud.cmclink.doc.entity.SpecialCargoApplyDO;
import com.cmc.cloud.cmclink.doc.vo.blnovslvoyvo.BlnoVslvoyUpdateReqVO;
import com.cmc.cloud.cmclink.doc.vo.sovo.attachmentvo.AttachmentUpdateReqVO;
import com.cmc.cloud.cmclink.doc.vo.specialcargoapplyvo.SpecialCargoVoyageUpdateReqVO;
import com.cmc.cloud.cmclink.doc.vo.specialcargocntrvo.SpecialCargoCntrBaseVO;

import java.util.List;

/**
 * 特种货审批主信息 Service 接口
 *
 * @author 集运管理员
 */
public interface ApplySaveOrUpdateService {
    /**
     * 保存或更新主信息
     *
     * @param applyDO 主信息
     * @return applyId
     */
    Long saveOrUpdateApply(SpecialCargoApplyDO applyDO);

    /**
     * 保存或更新航线并关联主信息
     *
     * @param spcVoyageInfo 航线信息
     * @param applyId       主信息ID
     * @param partnerFlag   是否是合作方
     */
    void saveOrUpdateVoyage(List<SpecialCargoVoyageUpdateReqVO> spcVoyageInfo, Long applyId, Boolean partnerFlag);

    /**
     * 保存或更新箱型信息并关联主信息
     *
     * @param cntrBaseInfo 箱型信息
     * @param applyId      主信息ID
     * @return 箱型ID
     */
    Long saveOrUpdateCntr(SpecialCargoCntrBaseVO cntrBaseInfo, Long applyId);

    /**
     * 保存附件
     *
     * @param spcAttachmentList 附件信息
     * @param applyId           主信息ID
     */
    void spcAttachmentSaveOrUpdate(List<AttachmentUpdateReqVO> spcAttachmentList, Long applyId);

    /**
     * 移除库里多余箱子
     *
     * @param applyId 主信息ID
     * @param cntrIds 入参箱数据
     */
    void removeCntr(Long applyId, List<Long> cntrIds);

    /**
     * 移除库里多余DG
     *
     * @param applyId 主信息ID
     * @param dgIds   dgIds
     */
    void removeDg(Long applyId, List<Long> dgIds);

    /**
     * 检验当前保存的箱尺寸是否包含在预配箱
     *
     * @param soId     soId
     * @param cntrList cntrList
     */
    void checkCntrSizeType(Long soId, List<SpecialCargoCntrBaseVO> cntrList);

    /**
     * 根据合作方航线信息更新是否过境上海
     * Transit CNSHA根据逻辑判断赋值，可编辑；判断逻辑：
     * 判断对应的Voyage Route信息中，所有航程的POL，POD是否为CNSHA，如果是，则是否过境上海为是；
     * 如果否，则需要根据每一程的航线Lane去航线船期-船期生成模块查询港口列表是否存在CNSHA，如果存在则需要继续判断是否为跳港，存在且为未跳港状态时否过境上海为是。
     * 其他否。
     *
     * @param polCode    polCode
     * @param podCode    podCode
     * @param voyageInfo voyageInfo
     * @return boolean
     */
    boolean updateTransitCnsha(String polCode, String podCode, List<SpecialCargoVoyageUpdateReqVO> voyageInfo);

    /**
     * @param bookingNo  bookingNo
     * @param voyageInfo voyageInfo
     */
    void updateVoyageInfo(String bookingNo, List<BlnoVslvoyUpdateReqVO> voyageInfo);

}
